package net.zjitc.tree;

public class MyTree<E> implements BinaryTree<E> {

    private TreeNode<E> root;

    public MyTree(TreeNode<E> root) {
        this.root = root;
    }

    public TreeNode<E> getRoot() {
        return root;
    }

    public void setRoot(TreeNode<E> root) {
        this.root = root;
    }

    /**
     * 在node节点添加左孩子
     *
     * @param node
     * @param var
     */
    @Override
    public void insertL(TreeNode<E> node, E var) {
        if (node.Left != null){
            throw new RuntimeException("左子树已经存在，不能添加");
        }
        TreeNode<E> newNode = new TreeNode<>(var);
        node.Left = newNode;
    }

    /**
     * node节点上添加右孩子
     *
     * @param node
     * @param var
     */
    @Override
    public void insertR(TreeNode<E> node, E var) {
        if (node.right != null){
            throw new RuntimeException("右子树已经存在，不能添加");
        }
        TreeNode<E> newNode = new TreeNode<>(var);
        node.right = newNode;
    }

    /**
     * 获得node的左孩子
     *
     * @param node
     * @return
     */
    @Override
    public TreeNode<E> getLChild(TreeNode<E> node) {
        return node.Left;
    }

    /**
     * 获得node的右孩子
     *
     * @param node
     * @return
     */
    @Override
    public TreeNode<E> getRChild(TreeNode<E> node) {
        return node.right;
    }

    //遍历：前序 递归
    public void preOrder(TreeNode node){
        if (node!= null){
            //根
            System.out.println(node.data);
            //左
            preOrder(node.Left);
            //右
            preOrder(node.right);
        }
    }

    //中
    public void midOrder(TreeNode node){
        if (node!= null){

            //左
            midOrder(node.Left);
            //根
            System.out.println(node.data);
            //右
            midOrder(node.right);
        }
    }

   public void traversal(int type){
        switch (type){
            case 1: //前序
                preOrder(root);
                break;
            case 2:
                midOrder(root);
                break;
        }
   }
}
